BASIC OF C(1-10)

main 함수는 일반적으로 return 0로 한다.
변수와 상수(variables and constant)
변할수 있는 데이터와 변할 수 없는 데이터
#include<stdio.h>
int main(void){
int a= 7;
printf("The number is %d.\n",a);
system("pause");
return 0;
}
초기화 되지 않은 변수는 쓰레기 값이 들어갑니다.
Visual Studio 는 기본적으로 초기화 되지 않은 변수를 만들시 오류 출력(scanf와 같이 받는 값은 상관 없음)

정적변수로 선언된 것은 기본적으로 0으로 값이 초기화 됨
int (4byte)
long long (8byte)
double (8byte)
string (C++)
bool (C++)
char
예약어와 식별자
식별자(Identifier)란 변수나 함수 등의 고유한 이름을 지정할 때 사용한다.
이 때 C언어 문법으로 정해진 예약어는 식별자로 사용 불가능
기본 입출력
scanf()
Visual Studio에서는 _CRT_SECURE_NO_WARNINGS를 사용하지 않으면 취약한 함수로 분류되어 사용 불가능
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void){
int a;
scanf("%d", %a);
printf(" %d.\n",a);
system("pause");
return 0;
}
%d    int
%lld    longlong
%lf    double(입력시)
%f    double(출력시)
%f    float(입력 및 출력)
%s    string
%c    char

%e    지수 표기법(출력시)
%.2f        소수점 2째 자리 까지 실수 출력(반올림 적용)
Operator & Operand
A+B 에서 A,B는 피연사자 +는 연산자
대입 산술 관계 논리 증감 삼항 비트 연산자 등이 있음
대입 연산자 =
우변항을 좌변항에 넣을 수 있다.(자료형에 부합하는)
사칙 연산
+, -, *, /(나머지 제외), %(나머지)
이스케이프 시퀀스(Escape Sequence)
\n    줄바꾸기
\t    수평 탭 넣기
\\    백슬래시 넣기
\”    큰 따옴표 넣기
\b    백 스페이스 넣기
관계연산자
>, <, ==, !=, >=, <=
입력: 0을 False 그위를 True로 입력 받음
출력: 0을 False로 1을 True로 출력함
논리연산자
!, &&, ||
tip)
컴퓨터한테 if(a>b>c)와 같은 논리 연산을 시킬시
a>b인 경우 if(1>c)와 같은 순서로 논리 회로가 진행됨
(a<b인 경우 if(1<c)와 같은 순서로 논리 회로 진행)
따라서 if((a>b)&&(b>c))와 같이 AND 논리를 이용해서 코드 작성해야 함!
증감 연산자
++(변수), (변수)++, --(변수), (변수)—
출력 전/후에 증감 연산자가 진행됨이 차이점
삼항 연산자
ex) a==b?100:-100

if(a==b) return 100;
else return -100
비트 연산자
~    부정
&    AND
|    OR
^    XOR
<<    왼쪽 쉬프트(Arithmatic shift)—> same as X2
<<<    unsigned 왼쪽 쉬프트(Logic shift)
연산자 우선순위(수학에서의 연산자 순위와 유사)
++, --
!, ~
*, /, %
+, -
<<, >>
<, <=, >, >=
==, !=
비트, 논리, 삼항 연산자
삼항 연산자
조건문(if & switch)
IF문
조건의 종류가 많지 않을 때 유리함.
else if 는 최대한 적게 사용하는 것이 좋음
(만일 범위가 겹치면 겹치는 범위의 조건문을 모두 시행함)
if(1){
// 1
}
else if(2){
//1 2
}
else{
//
}
Switch문
다양한 조건이 존재할 때 사용하면 유리
(swich는 특정 조건을 만족할 시 그 아래의 조건들이 모두 시행됨 따라서 break 사용)
switch( ){
case 1:
//
break
case 2:
//
break
default:
//else
}
break을 이용한 코드 작성
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(void){
printf(" :");
int a;
scaf("%d",&a);
switch(a):
case 1: case 2: case3:
printf("Spring\n"); break;
case 4: case 5: case 6:
printf("Summer\n"); break;
case 7: case 8: case 9:
printf("Fall\n"); break;
case 10: case 11: case 12:
printf("Winter\n"); break;
}
반복문(FOR & WHILE)
FOR문
내부의 조건이 부합하면 계속해서 특정한 구문을 실행
반복문을 탈출하고자 하는 위치에 break 구문을 삽입
for(;; ){
//
}
전통적인 C언어는 for문 내에서 초기화 하는것을 금지하고 있었다.
for(int a=0;i<10;i++)

하지만 현대의 컴파일러는 허용해줌
int i=a;
for(i=0;i<10;i++);
무한 루프(infinite Loop)
종료 조건 없이 한없이 반복되는 반복문을 의미
for(;; ){
// True
}
ex) for(;;)
while
while문의 조건에 부합하면 계속해서 특정한 구문을 실행한다.
반복문을 탈출하고자 할때는 break 구문 삽입
while(){
//
}
자주사용하는 n번 반복하는 예제)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void){
int n;
scanf("%d",&n);
while(n--){
printf("%d\n",n);
}
system("pause");
return 0;
}
중첩된 반복문
반복문이 중첩될 수로 제곱형태로 연산이 증가함.
행렬 그래프등의 연산에서 자주 사용됨.
모든 while문은 for문으로 모든 for문은 while문으로 변경할 수 있다.
내부적으로 for문과 while문은 동일하게 행동함.
(C언어 소스코드가 최적화 되면서 어셈블리어에서 동일한 명령어로 동작)
함수
입력을 받고 특정한 명령어를 거쳐 출력을 함
소스코드가 반복되는 것을 줄여주는 기능을 한다.
(){
//
return ;
}
매개변수와 return 없어도 된다.
매개변수 및 반환할 값이 없을 때 자료형 void
재귀함수
자기 자신을 포함하는 함수
기본적으로 자기 자신을 계속 불러낸다.
따라서 반드시 재귀 종료 조건이 필요하다.
경우에 따라서 재귀함수는 연산 횟수(무한 루프)가 급격하게 증가할 수 있음.

아래는 재귀함수 중 가장 유명한 factorial 함수이다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int factorial(int a){
if(a==1)return 1;
else return a*factorial(a-1);
}
배열
변수가 많을 때 즉, 각각 선언할 수 없을 때 사용함.
동일한 성격의 데이터를 다수 표현할 수 있다.
index 0부터 시작한다.
[ ]={ };
초기화 값은 없을 수도 있다.
#include<stdio.h>
#include<limits.h>
int main(void){
int a[10]={6,5,4,3,9,8,0,1,2,7};
int i, maxValue=INT_MIN;
for(i=0;i<10;i++){
if(maxValue<a[i])maxValue=a[i];
}
printf("%d\n",maxValue);
system("pause");
}
INT_MIN
최댓값을 구하기 위해 자주 사용되는 기능
<limits.h> 헤더파일에 정의되어 있음 int형 범위의 최솟값을 반환(상수)
문자열과 배열
원시적인 C언어는 기본적으로 자체적인 문자열 자료형이 없음
여러개의 문자열을 묶어놓는 형태로 문자열을 표현
C++에서는 string 자료형 제공

C언어에서 문자의 배열을 쓴다는 점이 단점이지만 개별적인 인덱스 문자로 접근이 편리함.
Pointer
core module 개발, Assembly 를 배울 때 유용함

지금까지의 변수는 그 자체로 자신의 자료형에 맞는 값을 저장.
하지만 포인터 변수는 특이한 변수로, 메모리 주소를 저장한다.
ex) (int *) int형을 가리키는 포인터 자료형

포인터는 특정한 변수 자체가 존재하는 메모리 주소의 값을 가진다.
int a=5;
int *b=&a;
포인터 변수 b에 a의 주소 저장

선언시에는 int *b는 b가 포인터 변수임을 알려주기 위한 목적
이후에는 *b는 포인터 변수 b가 가르키는 주소의 값을 의미함
포인터 관련 연산자
&(주소 연산자)        변수앞에 붙어서 변수의 메모리 시작 주소 값을 가진다.
*(포인터)            포인터 변수를 선언할 때 사용
*(간접참조 연산자)        선언된 포인터 변수가 가르키는 변수를 구한다.

포인터와 간접참조 연사자는 똑같이 생겼지만 사용되는 의미가 다름!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(void){
int a=5;
int *b=&a; //*()
printf("%d\n",*b); //*( )
system("pause");
return 0;
}
포인터의 기능
포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근할 수 있다.
기존에 존재하던 중요한 메모리 영역에 접근하지 않도록 해야함!
int *a=0x33484735;
*a=0;
위의 형태는 굉장히 위험한 코드이다.
기존에 0x33484735라는 주소에 어떤 데이터가 들어있는 줄 모르기 때문에 이는 의도하지 않은 형식으로 코드가 바뀌게 된다.
다중 포인터
게임들을 개발할 때 유용하게 사용됨.
#include<stdio.h>
int main(void){
int a=5;
int *b=&a;
int **c=&b;
printf("%d",**c);
system("pause");
return 0;
}
배열과 포인터
배열과 포인터는 동일함.
배열을 선언한 이후에는 그 이름 자체가 포인터 변수와 동일하다.
#include<stdio.h>
int main(void){
int a[]{1,2,3,4,5,6,7,8,9,10};
int *b=a; //
printf("%d\n",b[2]);
system("pause");
return 0;
}
배열과 포인터는 상호 치환되어서 사용가능하다